www.gusucode.com > 基于VBLAST-OFDM的MATLAB SIMULATION,图形化界面,并且给出了各仿真图 > 基于VBLAST-OFDM的MATLAB SIMULATION,图形化界面,并且给出了各仿真图/vblast-ofdm simulation/channel.m

    

function rx_signal = channel(tx_signal, cir, SimulationParameters,SNR);

global SimulationConstants;

[n_tx_antennas, n_rx_antennas] = get_n_antennas(SimulationParameters);

if SimulationParameters.VBLAST~=1
    % Channel effect
    rx_signal = zeros(n_rx_antennas, size(tx_signal,2)+size(cir,2)-1);
    for rx_ant = 1:n_rx_antennas   
        for tx_ant = 1:n_tx_antennas
         rx_signal(rx_ant,:) = rx_signal(rx_ant,:) + ...
         conv(tx_signal(tx_ant,:), cir((rx_ant-1)*n_tx_antennas+tx_ant,:));
        end
    end
else % go vblast
    temp=size(tx_signal,1);
 
    if temp==1 & SimulationParameters.N==2
        cir11=get_channel_ir(SimulationParameters);
        
        cir12=get_channel_ir(SimulationParameters);
        
        cir11=cir11(1);
        cir12=cir12(1);
        
        save cir11 cir11;
        save cir12 cir12;
        cir_mimo=[cir11;cir12];
    % Channel effect
    rx_signal = zeros(n_rx_antennas, size(tx_signal,2)+size(cir_mimo,2)-1);
       for tx_ant = 1:n_tx_antennas
          for rx_ant = 1:n_rx_antennas   
            rx_signal(rx_ant,:) = rx_signal(rx_ant,:) + ...
             conv(tx_signal(tx_ant,:), cir_mimo(rx_ant,tx_ant));
          end
       end

elseif temp==2 & SimulationParameters.N==2
        cir11=get_channel_ir(SimulationParameters);
        cir12=get_channel_ir(SimulationParameters);
        cir21=get_channel_ir(SimulationParameters);
        cir22=get_channel_ir(SimulationParameters);

        cir11=cir11(1);
        cir12=cir12(1);
        cir21=cir21(1);
        cir22=cir22(1);

        save cir_22 cir11 cir12 cir21 cir22 ;

        cir_mimo1=[cir11;cir12];
        cir_mimo2=[cir21;cir22];
        cir_mimo=[cir_mimo1 cir_mimo2];

    % Channel effect
    rx_signal = zeros(n_rx_antennas, size(tx_signal,2)+size(cir_mimo,2)-2);
    for tx_ant = 1:n_tx_antennas
        for rx_ant = 1:n_rx_antennas   
          rx_signal(rx_ant,:) = rx_signal(rx_ant,:) + ...
             conv(tx_signal(tx_ant,:), cir_mimo(rx_ant,tx_ant));
        end
    end
elseif temp==2 & SimulationParameters.N==3
        cir11=get_channel_ir(SimulationParameters);
        cir12=get_channel_ir(SimulationParameters);
        cir13=get_channel_ir(SimulationParameters);
        cir21=get_channel_ir(SimulationParameters);
        cir22=get_channel_ir(SimulationParameters);
        cir23=get_channel_ir(SimulationParameters);
        
        cir11=cir11(1);
        cir12=cir12(1);
        cir13=cir13(1);
        cir21=cir21(1);
        cir22=cir22(1);
        cir23=cir23(1);

 
        save cir_23 cir11 cir12 cir13 cir21 cir22 cir23 ;
        
        cir_mimo1=[cir11;cir12;cir13];
        cir_mimo2=[cir21;cir22;cir23];
        cir_mimo=[cir_mimo1 cir_mimo2];
    % Channel effect
    rx_signal = zeros(n_rx_antennas, size(tx_signal,2)+size(cir_mimo,2)-2);
    for tx_ant = 1:n_tx_antennas
        for rx_ant = 1:n_rx_antennas   
          rx_signal(rx_ant,:) = rx_signal(rx_ant,:) + ...
             conv(tx_signal(tx_ant,:), cir_mimo(rx_ant,tx_ant));
        end
    end
elseif temp==2 & SimulationParameters.N==4
        cir11=get_channel_ir(SimulationParameters);
        cir12=get_channel_ir(SimulationParameters);
        cir13=get_channel_ir(SimulationParameters);
        cir14=get_channel_ir(SimulationParameters);
        cir21=get_channel_ir(SimulationParameters);
        cir22=get_channel_ir(SimulationParameters);
        cir23=get_channel_ir(SimulationParameters);
        cir24=get_channel_ir(SimulationParameters);
        
        cir11=cir11(1);
        cir12=cir12(1);
        cir13=cir13(1);
        cir14=cir14(1);
        cir21=cir21(1);
        cir22=cir22(1);
        cir23=cir23(1);
        cir24=cir24(1);

 
        save cir_24 cir11 cir12 cir13 cir14 cir21 cir22 cir23 cir24;
        
        cir_mimo1=[cir11;cir12;cir13;cir14];
        cir_mimo2=[cir21;cir22;cir23;cir24];
        cir_mimo=[cir_mimo1 cir_mimo2];
    % Channel effect
    rx_signal = zeros(n_rx_antennas, size(tx_signal,2)+size(cir_mimo,2)-2);
    for tx_ant = 1:n_tx_antennas
        for rx_ant = 1:n_rx_antennas   
          rx_signal(rx_ant,:) = rx_signal(rx_ant,:) + ...
             conv(tx_signal(tx_ant,:), cir_mimo(rx_ant,tx_ant));
        end
    end
end
end
len = size(rx_signal,2);

% Add noise
% calculate noise variance
% Number of FFT points normalizes the noise with the used subcarrier number

if SimulationParameters.ZeroPad~=1
    numdatasubc=1;
else
    numdatasubc=SimulationConstants.NumDataSubc;
end

noise_var = 1/((SimulationParameters.FFTPoints/numdatasubc)*(10^(SNR/10)));

noise = sqrt(noise_var) * (randn(n_rx_antennas, len) + j*randn(n_rx_antennas, len));

% add noise
rx_signal = rx_signal+noise;